import { defineStore } from 'pinia';

import type { LockInfo } from '#/store';

import { useIdentityStore } from './identity';

/** 锁屏状态 */
interface LockState {
  /** 锁屏信息 */
  lockInfo: Nullable<LockInfo>;
}

/** 初始状态 */
const initState: LockState = {
  lockInfo: {},
};

/** 锁屏存储 */
export const useLockStore = defineStore(
  'app-lock',
  () => {
    /** 锁屏状态 */
    const state = ref<LockState>({ ...initState });

    /** 获取锁屏信息 */
    const getLockInfo = computed(() => unref(state).lockInfo);

    /** 设置锁屏信息 */
    const setLockInfo = (info: LockInfo) => {
      let { lockInfo } = state.value;
      lockInfo = Object.assign({}, lockInfo, info);
    };
    /** 重置锁屏信息 */
    const resetLockInfo = () => {
      state.value = { ...initState };
    };

    /** 解锁（Unlock） */
    const unLock = async (password?: string) => {
      const identityStore = useIdentityStore();
      const { lockInfo } = state.value;
      if (lockInfo?.pwd === password) {
        resetLockInfo();
        return { Succeeded: true, Message: '' };
      }
      const tryLogin = async () => {
        const username = identityStore.getUserInfo?.UserName;
        const res = await identityStore.checkLogin({
          Account: username,
          Password: password!,
          goHome: false,
          mode: 'none',
        });
        if (res.Succeeded) {
          resetLockInfo();
        }
        return { Succeeded: res.Succeeded ?? false, Message: res.Content };
      };
      return await tryLogin();
    };

    return {
      /** 锁屏状态 */
      state,
      /** 获取锁屏信息 */
      getLockInfo,
      /** 设置锁屏信息 */
      setLockInfo,
      /** 重置锁屏信息 */
      resetLockInfo,
      /** 解锁（Unlock） */
      unLock,
    };
  },
  {
    persist: true, // 如果需要持久化就写 true, 不需要持久化就写 false（或者去掉这个配置项）。
  },
);
